package 剑指offer;

import java.util.Arrays;
import java.util.HashMap;

public class p50第一个只出现一次的字符 {
    public char firstUniqChar1(String s) {
        char[] charArray = s.toCharArray();//字符串转数组

        HashMap<Character, Boolean> map=new HashMap<>();//创建哈希表

        for (char c:charArray) {
            //将字符录入哈希表中，针对已有字符进行value值的修改
            map.put(c,!map.containsKey(c));
        }

        for (char c:charArray) {
            //返回哈希表中，第一个value值为true的key值
            if(map.get(c)) {
                //HashMap的get(key)方法返回key对应的value的值
                return c;
            }
        }

        return ' ';

    }


    public char firstUniqChar2(String s) {
        //哈希表之 Character,Integer
        if (s.length()==0) {
            return ' ';
        }
        char[] chars = s.toCharArray();
        HashMap<Character,Integer> map=new HashMap<>();

        for (char c:chars) {
            map.put(c,map.getOrDefault(c,0)+1);
        }

        for (char c:chars) {
            int count = map.get(c);
            if (count==1) {
                return c;
            }
        }

        return ' ';
    }


    //使用 Fasle 标记状态相对于 Integer 的不断递增更合理，也更省空间。
    public char firstUniqChar(String s) {
        //哈希表之 Character,Integer
        HashMap<Character,Boolean> map=new HashMap<>();
        char[] chars = s.toCharArray();

        for (char c:chars) {
            map.put(c,map.containsKey(c));
            //只出现过一次的字符，它的value是false;
        }
        for (char c:chars) {
            if (!map.get(c)) {
                return c;
            }
        }
        return ' ';
    }
}
